#include <iostream>
#include <random>
#include <iomanip> // setw()设置位宽
#include <sstream>
#include <atomic>

static std::string uuid()
{
    std::random_device rd;
    std::mt19937_64 generator(rd());                            // 通过梅森旋转算法，生成一个伪随机数
    std::uniform_int_distribution<size_t> distribution(0, 255); // 限定随机数范围[0, 255]
    std::stringstream ss;
    for (int i = 0; i < 8; i++) // 添加8个2位16进制[0, 255]随机数，拼接得到16位字符串
    {
        ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
        if (i == 3 || i == 5 || i == 7)
            ss << "-";
    }
    static std::atomic<size_t> sep(1); // 设置为static，原子类型整数，初始化为1
    size_t num = sep.fetch_add(1);     // 类似于后置++
    for (int i = 7; i >= 0; i--)       // 64位无符号整型，分8次分别以8位为单位从高位到低位处理
    {
        ss << std::setw(2) << std::setfill('0') << std::hex << ((num >> (i * 8)) & 0xff);
        if (i == 6)
            ss << "-";
    }
    return ss.str();
}

int main()
{
    for(int i = 0; i < 10; i++)
    {
        std::cout << uuid() << std::endl;
    }

    // std::random_device rd;
    // // size_t num = rd(); // 生成一个机器随机数(由机器生成)，效率较低
    // // std::cout << num << std::endl;
    // std::mt19937_64 generator(rd()); // 通过梅森旋转算法，生成一个伪随机数
    // // std::cout << gernator() << std::endl;
    // std::uniform_int_distribution<size_t> distribution(0, 255); // 限定随机数范围[0, 255]
    // // std::cout << std::setw(2) << std::setfill('0') << std::hex << distribution(generator) << std::endl;
    // std::stringstream ss;
    // for (int i = 0; i < 8; i++) // 添加8个2位16进制[0, 255]随机数，拼接得到16位字符串
    // {
    //     ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
    //     if (i == 3 || i == 5 || i == 7)
    //         ss << "-";
    // }
    // // std::cout << ss.str() << std::endl;
    // static std::atomic<size_t> sep(1); // 设置为static，原子类型整数，初始化为1
    // size_t num = sep.fetch_add(1);     // 类似于后置++
    // for (int i = 7; i >= 0; i--)       // 64位无符号整型，分8次分别以8位为单位从高位到低位处理
    // {
    //     ss << std::setw(2) << std::setfill('0') << std::hex << ((num >> (i * 8)) & 0xff);
    //     if (i == 6)
    //         ss << "-";
    // }
    // std::cout << ss.str() << std::endl;
    return 0;
}